package com.lgy.translate.main;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.lgy.translate.utils.EncodingDetect;
import com.lgy.translate.utils.TransApi;

import java.io.*;

/**
 * @author l921
 */

public class FileTranslateOperation {

    /**
     * 百度AI app_id
     */
    private static final String APP_ID = "";
    /**
     * 百度AI SECURITY_KEY
     */
    private static final String SECURITY_KEY = "";

    /**
     * 读取文件前判断文件编码
     *
     * @param newFile 需要判断的文件
     *
     * @return 文件编码格式
     *
     * @date 2021-1-31
     */
    public static String fileJudgingCode(File newFile) {

        EncodingDetect s = new EncodingDetect();
        return EncodingDetect.javaname[s.detectEncoding(newFile)];

    }


    /**
     * 读取字幕文件，翻译，并写入生成新文件
     * @param iniPath 文件路径
     * @return 布尔类型 true:执行成功 false:执行失败
     * @date 2021-1-17
     */
    public static boolean batchTranslationOperation(String iniPath) {
        // 替换文件路径
        File file = new File(iniPath);
        byte[] fileContext = new byte[(int) file.length()];

        FileInputStream in = null;
        PrintWriter out = null;

        try {
            // 替换文件操作
            in = new FileInputStream(file);
            in.read(fileContext);
            // 判断文件编码格式
            String fileCode = fileJudgingCode(file);
            String str = new String(fileContext, fileCode);
            // 按换行符分离字符串
            String[] content = str.split("(\r\n|\r|\n|\n\r)");
            StringBuilder newStr = new StringBuilder("");
            for (int i = 0; i < content.length; i++) {
                if (!"".equals(content[i])) {
                    // 判断每行是否包含字母
                    boolean str2 = content[i].matches(".*[a-zA-z].*");
                    // 若包含字母则调用百度翻译 否则则跳出直接写入文件
                    if (str2) {
                        String translationMsg = translationOperation(content[i]);
                        assert translationMsg != null;
                        content[i] = content[i].replace(content[i], translationMsg);
                    }
                    newStr.append(content[i]).append("\r\n");
                    //Thread.sleep(800);
                    System.out.println(i + ":" + content[i]);
                } else {
                    newStr.append(content[i]).append("\r\n");
                }
            }
            out = new PrintWriter(file, "utf-8");
            out.write(newStr.toString());
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                out.flush();
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }

        }

    }


    /**
     * 调用百度Api翻译文本内容
     *
     * @param sourceTranslation 需要翻译的文本内容
     *
     * @return 译文内容
     *
     * @date 2021-1-17
     */
    public static String translationOperation(String sourceTranslation) {

        try {

            TransApi api = new TransApi(APP_ID, SECURITY_KEY);

            String query = sourceTranslation;
            // 得到百度API返回的Json字符串
            String resultMsg = api.getTransResult(query, "auto", "zh");

            // 解析字符串得到译文内容
            if (resultMsg != null && !"".equals(resultMsg)) {
                // 解析json字段
                JsonObject jsonObj = (JsonObject) new JsonParser().parse(resultMsg);
                // 获取json字段中的
                String res = jsonObj.get("trans_result").toString();
                // result字段，因为result字段本身即是一个json数组字段，所以要进一步解析
                // 解析json数组字段
                JsonArray js = new JsonParser().parse(res).getAsJsonArray();
                // result数组中只有一个元素，所以直接取第一个元素
                jsonObj = (JsonObject) js.get(0);
                // 得到dst字段，即译文，并输出
                return jsonObj.get("dst").getAsString();

            } else {
                System.out.println("翻译为空！");
                return null;
            }

        } catch (Exception e) {
            System.out.println("翻译失败");
            e.printStackTrace();
            return null;
        }

    }


}
